
require("Scripts/Common/Utility")
require("Scripts/Common/Class")
require("Scripts/UISystem/EventDispatcher")

DisplayObject = Class(EventDispatcher)

function DisplayObject:Ctor()
	self._name = nil					-- 控件的名称
	self._show = nil					-- 显示控件
	self._parent = nil					-- 父控件

	self._x = 0					-- 控件的x坐标
	self._y = 0					-- 控件的y坐标

	self._width = 0				-- 控件的宽度
	self._height = 0			-- 控件的高度

	self._red = 0				-- 控件的红色分量
	self._green = 0				-- 控件的绿色分量
	self._blue = 0				-- 控件的蓝色分量

	self._alpha = 1				-- 控件的alpha

	self._visible = true		-- 控件相对是否可见
	self._abs_visible = true	-- 控件绝对是否可见

	self._disable = false		-- 控件是否禁用

	-- 如果某类型的控件接受滚动事件，那么执行self._can_scroll = true
end

-- 当前控件，相对于窗口的坐标
function DisplayObject:LocalToGlobal()
	local x = self._x
	local y = self._y
	local parent = self._parent
	while parent do
		x = x + parent._x
		y = y + parent._y
		parent = parent._parent
	end
	return x, y
end

-- 窗口的坐标，相对于当前控件的坐标
function DisplayObject:GlobalToLocal(x, y)
	local parent = self
	while parent do
		x = x - parent._x
		y = y - parent._y
		parent = parent._parent
	end
	return x, y
end

-- 设置控件的x坐标
function DisplayObject:SetX(x)
	-- 设置x坐标
	self._x = x
	-- 设置到show中
	if self._show then
		self._show:SetX(x)
	end
end
function DisplayObject:GetX(x)
	return self._x
end

-- 设置控件的y坐标
function DisplayObject:SetY(y)
	-- 设置y坐标
	self._y = y
	-- 设置到show中
	if self._show then
		self._show:SetY(y)
	end
end
function DisplayObject:GetY()
	return self._y
end

-- 设置控件的宽
function DisplayObject:SetWidth(w)
	-- 设置宽
	self._width = w
	-- 设置到show中
	if self._show then
		self._show:SetWidth(w)
	end
end
function DisplayObject:GetWidth()
	return self._width
end

-- 设置控件的高
function DisplayObject:SetHeight(h)
	-- 设置高
	self._height = h
	-- 设置到show中
	if self._show then
		self._show:SetHeight(h)
	end
end
function DisplayObject:GetHeight()
	return self._height
end

-- 设置控件的Red颜色
function DisplayObject:SetRed(red)
	-- 设置颜色
	self._red = red
	-- 设置到show中
	if self._show then
		self._show:SetRed(red)
	end
end
function DisplayObject:GetRed()
	return self._red
end
-- 设置控件的Green颜色
function DisplayObject:SetGreen(green)
	-- 设置颜色
	self._green = green
	-- 设置到show中
	if self._show then
		self._show:SetGreen(green)
	end
end
function DisplayObject:GetGreen()
	return self._green
end
-- 设置控件的RGB颜色
function DisplayObject:SetBlue(blue)
	-- 设置颜色
	self._blue = blue
	-- 设置到show中
	if self._show then
		self._show:SetBlue(blue)
	end
end
function DisplayObject:GetBlue()
	return self._blue
end

-- 设置控件的alpha
function DisplayObject:SetAlpha(alpha)
	self._alpha = alpha
	local abs_alpha = 1
	if self._parent then
		abs_alpha = self._parent._abs_alpha * alpha
	else
		abs_alpha = alpha
	end
	if self._show then
		self._show:SetAlpha(abs_alpha)
	end
end
function DisplayObject:GetAlpha()
	return self._alpha
end

-- 设置控件是否可见
function DisplayObject:SetVisible(visible)
	self._visible = visible
	if self._parent then
		self._abs_visible = self._parent._abs_visible and visible
	else
		self._abs_visible = visible
	end
	if self._show then
		self._show:SetVisible(self._abs_visible)
	end
end

-- 设置控件是否禁用
function DisplayObject:SetDisable(disable)
	self._disable = disable
	if self._parent then
		self._abs_disable = self._parent._abs_disable or disable
	else
		self._abs_disable = disable
	end
end

-- 检测(x, y)点是否在控件内部
function DisplayObject:PickUp(x, y)
	-- 检查是否被禁用，是否可见
	if self._abs_disable or self._abs_visible == false then return nil, nil end
	-- 滚动焦点
	local scroll_control = nil
	-- 检查位置是否在控件范围内
	if x >= self._x and y >= self._y and x - self._x < self._width and y - self._y < self._height then
		if self._can_scroll then scroll_control = self end
		return scroll_control, self
	else
		return scroll_control, nil
	end
end
